<?php
/**
 * Created by PhpStorm.
 * User: s.utkin
 * Date: 16.09.14
 * Time: 16:02
 */

namespace Resources;


use Resources\Queue;
use Pinenut\Di\Injectable;
use Pinenut\Service\Dispatcher;
use Resources\Config\PackagesConfig;

/**
 * функционал для публкации файлов
 *
 * @package Resources
 */
class Publisher {
	use Injectable;

	/**
	 * Базовый путь к каталогу публикации файлов
	 *
	 * @var string
	 */
	public static $basePath = '';

	/**
	 * Базовый URI опубликованных файлов
	 *
	 * @var string
	 */
	public static $baseUri = '/resources';


	public static function getUri($fileName, $returnRelativePath, $packageName) {
		$prefix = $returnRelativePath ? '' : static::$baseUri;

		if (!isset(PackagesConfig::$config[$packageName]) && (substr($packageName, 0, 5) != 'group')) {
			throw new \Exception("Package $packageName not found in PackagesConfig.");
		}

		$version = 0;
		if (isset(\PublishedResources\PublishedPackagesConfig::$config[$packageName])) {
			$version = (int)\PublishedResources\PublishedPackagesConfig::$config[$packageName];
		}

		return $prefix . '/' . $packageName . $version . '/' . $fileName;
	}

	/**
	 * Возвращает полный путь к файлу
	 *
	 * @param $fileName - относительный путь к файлу
	 * @return string
	 * @throws \Exception
	 */
	public static function getRealFilePath($fileName) {
		if (file_exists($fileName)) {
			return $fileName;
		}

		# Формируем список каталогов на основе include_path
		$includePathString = get_include_path();
		$includePathList = explode(':', $includePathString);

		# Ищем в каждом каталоге
		foreach ($includePathList as $includePath) {
			$possibleFilePath = realpath($includePath) . DIRECTORY_SEPARATOR . $fileName;
			if (file_exists($possibleFilePath)) {
				return $possibleFilePath;
			}
		}

		throw new \Exception("File not found: $fileName");
	}


	public static function publishPackage($packageName, $version = 1)
	{
		# Создаем уведомление о необходимости опубликовать пакет
		Queue::enqueue(['package' => $packageName, 'version' => $version]);
	}

	public static function publishGroup($groupName, $version = 1)
	{
		# Создаем уведомление о необходимости опубликовать группу
		Queue::enqueue(['group' => $groupName, 'version' => $version]);
	}

	/**
	 * Возвращает содержимое runtime-конфига
	 *
	 * @param bool $returnGroups
	 * @return array
	 */
	public static function getRuntimeConfig($returnGroups = false)
	{
		include_once realpath(PINENUT_APPLICATION . '/../runtime/PublishedResources/PublishedPackagesConfig.php');

		$runtimeConfigClassName = '\PublishedResources\PublishedPackagesConfig';
		if (!method_exists($runtimeConfigClassName, 'get')) {
			return [];
		}

		return $returnGroups ? $runtimeConfigClassName::$groups : $runtimeConfigClassName::$config;
	}

	public static function setRuntimeConfig($packages = null, $groups = null, $safeMode = false)
	{
		$request = new \Request('resources.config.generateRuntime', ['packages' => $packages, 'groups' => $groups, 'safeMode' => $safeMode]);
		Dispatcher::action($request);
	}

	public static function getPackageRelativeDir($packageClassName)
	{
		$tmp = explode('\\', $packageClassName);
		array_pop($tmp);
		$tmp = array_filter($tmp);
		$tmp = implode('/', $tmp);
		return $tmp;
	}
}
